package com.codewsq.block;

/*
 *
 * 同一个类中，给普通类属性赋值的加载顺序：
 * 1.默认初始化值
 * 2.显示的给属性赋值/代码块赋值
 * 3.代码块赋值
 * 4.对象.属性 对象.方法赋值
 *
 *
 * 继承关系运行顺序：
 * 静态代码块 -> 普通代码块 -> 构造器： 父类静态代码块 -> 子类静态代码块
 * 子类继承父类，代码块运行顺序：
 * 1.首先加载父类静态代码块，再加载子类静态代码块
 * 2.其次加载父类普通代码块->父类构造器，然后加载子类普通代码块 -> 子类普通构造器
 * 3.如果此时子类又实例化了一个新的对象，那么静态代码块不再加载，但是普通代码块会和第一个实例化对象的顺序一样，
 *   加载父类普通代码块->父类构造器，然后加载子类普通代码块 -> 子类普通构造器
 *
 * */
class BlockTest {
    public static void main(String[] args) {
        But but1 = new But();
        System.out.println("****************************");
        But but2 = new But();
    }
}

public class Root {
    int id;

    static {
        System.out.println("Root static block");
    }

    {
        System.out.println("Root block");
    }

    public Root() {
        System.out.println("Root constructor");
    }

}

class Mid extends Root {
    static {
        System.out.println("Mid static block");
    }

    {
        System.out.println("Mid block");
    }

    public Mid() {
        System.out.println("Mid constructor");
    }
}

class But extends Mid {
    static {
        System.out.println("But static block");
    }

    {
        System.out.println("But block");
    }

    public But() {
        System.out.println("But constructor");
    }
}
